package org.optional;

import java.util.Arrays;

import com.google.common.base.Optional;

/**
 * Hello world!
 *
 */
public class App {
	
    public static void main( String[] args ) {
    	try {
    		System.out.println( "Hello World!" );
    		testOptional();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    }
    
    public static void testOptional() {
    	// 1.Optional.of(T) 创建指定引用的Optional实例, 若引用为null则快速失败
    	Optional<Integer> possible = Optional.of(5);
    	System.out.println(possible.get()); // 5
    	System.out.println(possible.isPresent()); // true
    	// Optional<Integer> nullPossible = Optional.of(null); // throw java.lang.NullPointerException
    	
    	// 2.Optional.absent() 创建引用缺失的Optional实例
    	Optional<Integer> absentOptional = Optional.absent();
    	System.out.println(absentOptional.isPresent()); // false
    	
    	// 3.Optional.fromNullable(T) 创建指定引用的Optional实例，若引用为null则表示缺失
    	Optional<Integer> nullableOptional = Optional.fromNullable(50);
    	System.out.println(nullableOptional.isPresent()); // true
    	System.out.println(nullableOptional.get()); // 50
    	
    	Optional<Integer> nullableOptional2 = Optional.fromNullable(null);
    	System.out.println(nullableOptional2.isPresent()); // false
    	// System.out.println(nullableOptional2.get()); // java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
    	
    	// 4.boolean isPresent() 如果Optional包含非null的引用（引用存在），返回true
    	System.out.println("---isPresent---");
    	System.out.println(Optional.of(500).isPresent()); // true
    	System.out.println(Optional.absent().isPresent()); // false
    	//System.out.println(Optional.of(null).isPresent()); // java.lang.NullPointerException
    	
    	// 5.T get() 返回Optional所包含的引用，若引用缺失，则抛出java.lang.IllegalStateException
    	System.out.println("---get---");
    	System.out.println(Optional.of(123).get()); // 123
    	//System.out.println(Optional.absent().get()); // java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
    
    	// 6.T or(T) 返回Optional所包含的引用，若引用缺失，返回指定的值
    	System.out.println("---or---");
    	System.out.println(Optional.of(234).or(0)); // 234
    	System.out.println(Optional.absent().or(0)); // 0
    	
    	// 7.T orNull() 返回Optional所包含的引用，若引用缺失，返回null
    	System.out.println("---orNull---");
    	System.out.println(Optional.of(234).orNull()); // 234
    	System.out.println(Optional.absent().orNull()); // null
    	
    	// 8.Set<T> asSet() 返回Optional所包含引用的单例不可变集，如果引用存在，返回一个只有单个元素的和，如果引用缺失，返回一个空集合
    	System.out.println("---asSet---"); 
    	System.out.println(Optional.of(345).asSet()); // [345]
    	System.out.println(Optional.of("TestStr").asSet()); // [TestStr]
    	System.out.println(Optional.absent().asSet()); // []
    	Integer[] arrayInts = {1, 2, 3, 4};
    	System.out.println(Optional.of(arrayInts).asSet()); // [[Ljava.lang.Integer;@1e81f4dc]
    	System.out.println(Optional.of(Arrays.asList("1, 2, 3")).asSet()); // [[1, 2, 3]]
    	
    	// 9.Optional.of(first).or(second)
    	System.out.println("Optional.of(first).or(second)"); 
    	System.out.println(Optional.of(521).or(123));
    }
    
    public  static <T> void printOptional(Optional<T> optional) {
    	System.out.println(optional.get());
    }
}
